/***********************************************************************************/
/* csv_stringtrim() - trim whitespace and leading and trailing enclosures (quotes) */
/* returns a copy of the modified string */
-/* usage: p = csv_stringtrim(string, "\"") */
+/* usage: p = csv_stringtrim(string, "\"", 0) */
/***********************************************************************************/
char *
#ifdef DEBUG_MEM
-CSV_STRINGTRIM(const char *string, const char *enclosure,DEBUG_PARAMS)
+CSV_STRINGTRIM(const char *string, const char *enclosure, int strip_max, DEBUG_PARAMS)
#else
-csv_stringtrim(const char *string, const char *enclosure)
+csv_stringtrim(const char *string, const char *enclosure, int strip_max)
#endif
{
static const char *p1 = NULL;
char *p2 = NULL;
char * tmp = xxstrdup(string,file,line);
size_t elen;
+ int stripped = 0;
if (!strlen(string)) {
return (tmp);
p1++;
}
+ /* if no maximum strippage, assign a reasonable value to max */
+ strip_max = strip_max ? strip_max : 9999;
+
/* if we have enclosures, skip past them in pairs */
if (elen) {
- while (((size_t) (p2 - p1) > elen) &&
+ while (
+ (stripped < strip_max) &&
+ ((size_t) (p2 - p1) > elen) &&
(strncmp(p1, enclosure, elen) == 0) &&
(strncmp((p2 - elen + 1), enclosure, elen) == 0)) {
p2 -= elen;
p1 += elen;
+ stripped++;
}
}
/* IGNORE -- Calculated Sequence # For Ouput*/
} else
if (strcmp(fmp->key, "SHORTNAME") == 0) {
- wpt->shortname = csv_stringtrim(s, "");
+ wpt->shortname = csv_stringtrim(s, "", 0);
} else
if (strcmp(fmp->key, "DESCRIPTION") == 0) {
- wpt->description = csv_stringtrim(s, "");
+ wpt->description = csv_stringtrim(s, "", 0);
} else
if (strcmp(fmp->key, "NOTES") == 0) {
- wpt->notes = csv_stringtrim(s, "");
+ wpt->notes = csv_stringtrim(s, "", 0);
} else
if (strcmp(fmp->key, "URL") == 0) {
- wpt->url = csv_stringtrim(s, "");
+ wpt->url = csv_stringtrim(s, "", 0);
} else
if (strcmp(fmp->key, "URL_LINK_TEXT") == 0) {
- wpt->url_link_text = csv_stringtrim(s, "");
+ wpt->url_link_text = csv_stringtrim(s, "", 0);
} else
if (strcmp(fmp->key, "ICON_DESCR") == 0) {
- wpt->icon_descr = csv_stringtrim(s, "");
+ wpt->icon_descr = csv_stringtrim(s, "", 0);
wpt->icon_descr_is_dynamic = 1;
} else
char *
#ifndef DEBUG_MEM
-csv_stringtrim(const char *string, const char *enclosure);
+csv_stringtrim(const char *string, const char *enclosure, int strip_max);
#else
-CSV_STRINGTRIM(const char *string, const char *enclosure, DEBUG_PARAMS);
+CSV_STRINGTRIM(const char *string, const char *enclosure, int strip_max, DEBUG_PARAMS);
#define csv_stringtrim( s, e ) CSV_STRINGTRIM( s, e, __FILE__, __LINE__);
#endif
"#\n"
"FIELD_DELIMITER COMMASPACE\n"
"RECORD_DELIMITER NEWLINE\n"
-"BADCHARS COMMA\n"
+"BADCHARS \",\n"
"#\n"
"# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:\n"
"OFIELD LAT_DECIMAL, \"\", \"%08.5f\"\n"
"OFIELD LON_DECIMAL, \"\", \"%08.5f\"\n"
"OFIELD DESCRIPTION, \"\", \"\"%s\"\"\n"
-"OFIELD SHORTNAME, \"\", \"%s\"\n"
-"OFIELD DESCRIPTION, \"\", \"%s\"\n"
+"OFIELD SHORTNAME, \"\", \"\"%s\"\"\n"
+"OFIELD DESCRIPTION, \"\", \"\"%s\"\"\n"
"OFIELD CONSTANT, \"ff0000\", \"%s\" # COLOR\n"
"OFIELD CONSTANT, \"47\", \"%s\" # ICON\n"
;
#
FIELD_DELIMITER COMMASPACE
RECORD_DELIMITER NEWLINE
-BADCHARS COMMA
+BADCHARS ",
#
# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
OFIELD LAT_DECIMAL, "", "%08.5f"
OFIELD LON_DECIMAL, "", "%08.5f"
OFIELD DESCRIPTION, "", ""%s""
-OFIELD SHORTNAME, "", "%s"
-OFIELD DESCRIPTION, "", "%s"
+OFIELD SHORTNAME, "", ""%s""
+OFIELD DESCRIPTION, "", ""%s""
OFIELD CONSTANT, "ff0000", "%s" # COLOR
OFIELD CONSTANT, "47", "%s" # ICON
/* ignore: group */
break;
case 1:
- wpt_tmp->shortname = csv_stringtrim(s, "");
+ wpt_tmp->shortname = csv_stringtrim(s, "", 0);
break;
case 2:
/* Description is not a TopoMapPro format requirement.
If we assign "" then .loc/.gpx will generate empty XML tags :(
*/
- holder = csv_stringtrim(s, "");
+ holder = csv_stringtrim(s, "", 0);
if (strlen(holder))
wpt_tmp->description = holder;
break;
use the TopoMapLinks links.
(plus discards length 0 strings (so no empty XML tags))
*/
- holder = csv_stringtrim(s, "");
+ holder = csv_stringtrim(s, "", 0);
if (strstr(holder, "http:") != NULL)
wpt_tmp->url = holder;
break;
if (strlen(sbuff)) {
if (ISSTOKEN(sbuff, "FIELD_DELIMITER")) {
- sp = csv_stringtrim(&sbuff[16], "\"");
+ sp = csv_stringtrim(&sbuff[16], "\"", 1);
cp = get_char_from_constant_table(sp);
if (cp) {
xcsv_file.field_delimiter = xstrdup(cp);
} else
if (ISSTOKEN(sbuff, "RECORD_DELIMITER")) {
- sp = csv_stringtrim(&sbuff[17], "\"");
+ sp = csv_stringtrim(&sbuff[17], "\"", 1);
cp = get_char_from_constant_table(sp);
if (cp) {
xcsv_file.record_delimiter = xstrdup(cp);
} else
if (ISSTOKEN(sbuff, "DESCRIPTION")) {
- xcsv_file.description = csv_stringtrim(&sbuff[11],"");
+ xcsv_file.description = csv_stringtrim(&sbuff[11],"", 0);
} else
if (ISSTOKEN(sbuff, "EXTENSION")) {
- xcsv_file.extension = csv_stringtrim(&sbuff[10],"");
+ xcsv_file.extension = csv_stringtrim(&sbuff[10],"", 0);
} else
if (ISSTOKEN(sbuff, "SHORTLEN")) {
} else
if (ISSTOKEN(sbuff, "BADCHARS")) {
- sp = csv_stringtrim(&sbuff[9], "\"");
+ sp = csv_stringtrim(&sbuff[9], "\"", 1);
cp = get_char_from_constant_table(sp);
if (cp) {
xcsv_file.badchars = xstrdup(cp);
switch(i) {
case 0:
/* key */
- key = csv_stringtrim(s, "\"");
+ key = csv_stringtrim(s, "\"", 1);
break;
case 1:
/* default value */
- val = csv_stringtrim(s, "\"");
+ val = csv_stringtrim(s, "\"", 1);
break;
case 2:
/* printf conversion */
- pfc = csv_stringtrim(s, "\"");
+ pfc = csv_stringtrim(s, "\"", 1);
break;
default:
break;
switch(i) {
case 0:
/* key */
- key = csv_stringtrim(s, "\"");
+ key = csv_stringtrim(s, "\"", 1);
break;
case 1:
/* default value */
- val = csv_stringtrim(s, "\"");
+ val = csv_stringtrim(s, "\"", 1);
break;
case 2:
/* printf conversion */
- pfc = csv_stringtrim(s, "\"");
+ pfc = csv_stringtrim(s, "\"", 1);
break;
default:
break;